在前兩天的內容,我們以富果行情 API 結合 LINE Notify 為例,實現股票即時行情監控系統,讓投資人可以更有效地掌握進場與出場時機。今天我們要進一步來談關於交易系統的建立。軟體系統上線前,會經過不同階段的測試,確保產出的品質可以滿足需求,機械化的程式交易也不例外,在使用真金白銀進場前,最好先進行測試,驗證交易策略是否有效。
在金融市場中,主要有兩類交易者,一種是 主觀交易者,另一種是 系統交易者。主觀交易者的買賣決策主要依賴個人的判斷,容易受消息影響以及個人情緒的干擾;系統交易者則依靠機械化交易系統來獲取買賣信號,在市場上執行訂單。相較主觀交易,機械化交易系統有以下優勢:
程式交易就是達成機械化交易的一種手段,當交易系統發出買賣訊號時,讓電腦程式自動執行下單。
設計交易系統的目標,不是在歷史資料測試過程中達成最高的報酬,而是找到某種適用於過去的健全概念,顯示這種概念也非常可能適用於未來。根據 約翰· 墨菲 在《金融市場技術分析》的說明,建構交易系統的五個步驟是:
雖然對交易策略進行測試是一個重要的步驟,但在進行測試的過程中,不必過於執著績效的最佳化。因為運用歷史資料進行最佳化,經常造成不切實際的預期,實際交易通常都無法複製這些最佳化的績效。就如同我們常看到的投資警語是「過去績效不代表未來績效」。
回測對於建立交易系統是一個重要的過程,如何進行回測驗證交易想法呢?關於回測工具,在 Python 社群 backtrader 是很多人使用的回測框架。在 Node.js 也有人開發了 grademark 套件可以進行回溯測試。不過,使用這些工具的缺點是必須先收集大量的歷史資料,還要撰寫交易策略後才能進行績效評估,相當耗時。出於這個原因,筆者已習慣使用 TradingView 的策略測試器作為主要回測工具。
TradingView 是一個為交易者和投資者提供社群網路服務的平台,包含指數、股票、期貨、債券、外匯、加密貨幣等資料一應俱全,除了可以使用強大的圖表功能進行投資分析,也可以使用 股票篩選器 找出投資標的,還可以使用 策略測試器 對交易策略進行回測。在上述提到建構交易系統的 3、4、5 步驟皆可以在 TradingView 上執行,一有交易想法馬上可以驗證是否可行,是十分強大的投資工具。
TradingView 的策略測試器是免費功能,只要註冊會員就可以使用。以下我們會以台積電(2330)為交易標的,示範使用 60 日移動平均線(季線)策略。這個策略的進出條件相當簡單,當股價突破季線時買入,跌破季線時則賣出。
首先,登入 TradingView 網站。
在上方搜尋框,輸入台積電的股票代號「2330」。找到後,按下「啟動圖表」。
此時,TradingView 會帶出台積電的K線圖表。
在下方我們可以找到「策略測試器」。
TradingView 預設已經有非常多種策略可供套用,這裡我們選擇「移動揉搓線」。
選擇完畢後 TradingView 就會帶出這個策略的績效了,不過我們還需要調整一下設定。我們在輸入長度調整為「60」,也就是代表移動平均線為 60 日。
在屬性的設定,訂單數量調整為「1000」,代表每次買賣數量是 1000 股。需要注意這裡我們是將佣金設為 0%,不過真實交易必須考量手續費及交易稅,可以根據自己的需求調整設定。
然後我們就可以檢視一下跑出來的淨值曲線。
也可以查看這個策略跑出來的績效摘要。
在交易列表下,會列出每次交易的進出場紀錄。
Pine Script 是 TradingView 是由 TradingView 開發的一種程式語言,可以用來編寫技術指標和交易策略。「Pine 編輯器」就是 TradingView 用來撰寫 Pine Script 的工具。
前面使用 60 日移動平均線的範例,可以看到同時有多空進出場紀錄,因為 TradingView 預設的「移動揉搓線」策略是多空雙邊都做,也就是突破季線時多單建倉,跌破季線時多單平倉並且空單建倉,反之亦然。由於在臺股做空限制較多,如果希望將策略改成只做多不做空,這時就需要使用到「Pine 編輯器」來調整該策略的程式碼。
在 TradingView 的圖表畫面下方找到「Pine 編輯器」,然後選擇開啟內建腳本。
開啟預設腳本,搜尋並找到「MovingAvg Cross」,這就是剛剛的「移動揉搓線」策略。
選擇預設腳本後,我們可以在「Pine 編輯器」看到這個腳本的程式碼。
我們將程式碼修改如下:
//@version=5
strategy("均線策略", overlay=true)
length = input(60)
confirmBars = input(1)
price = close
ma = ta.sma(price, length)
bcond = price > ma
bcount = 0
bcount := bcond ? nz(bcount[1]) + 1 : 0
if (bcount == confirmBars)
strategy.entry("突破均線", strategy.long)
scond = price < ma
scount = 0
scount := scond ? nz(scount[1]) + 1 : 0
if (scount == confirmBars)
strategy.exit("跌破均線", "突破均線", profit = 1, loss = 1)
//plot(strategy.equity, title="equity", color=color.red, linewidth=2, style=plot.style_areabr)
完成後,我們儲存命名為「均線策略」。
回到「策略測試器」,我們可以載入剛剛寫好的腳本。
在交易列表下,可以看到已經改成只有多單的進出場記錄了。
經由上述範例,我們簡單示範了如何客製化交易策略。如果有任何交易想法,都可以在「Pine 編輯器」可以撰寫交易策略腳本,再經由「策略測試器」套用該腳本,就可以評估該交易策略的績效是否符合預期。
有關於 Pine Script 的詳細用法,可以參考 TradingView 的 Pine腳本語言參考手冊。
本系列文已正式出版為《Node.js 量化投資全攻略:從資料收集到自動化交易系統建構實戰》。本書新增了全新內容和實用範例,為你提供更深入的學習體驗!歡迎參考選購,開始你的量化投資之旅!
天瓏網路書店連結:https://www.tenlong.com.tw/products/9786263336070